'use strict';

const Service = require('egg').Service;
const moment = require('moment');

/**
 * 俱乐部申请服务类
 * 处理俱乐部申请相关的数据库操作和业务逻辑
 */
class a8Service extends Service {
  /**
   * 获取所有俱乐部申请
   * 返回未删除的俱乐部申请列表
   * @returns {Promise<Array>} 俱乐部申请列表
   */
  async findAll() {
    const sql = `
      SELECT * 
      FROM a8_club_applications 
      WHERE 1 = 1
      ORDER BY id DESC
    `;
    const result = await this.app.mysql.query(sql);
    return result;
  }

  /**
   * 根据ID获取俱乐部申请
   * 返回俱乐部申请信息
   * @param {number} id - 俱乐部申请ID
   * @returns {Promise<Object|null>} 俱乐部申请信息，不存在时返回null
   */
  async findById(id) {
    const sql = `
      SELECT * 
      FROM a8_club_applications 
      WHERE id = ?
    `;
    const result = await this.app.mysql.query(sql, [id]);
    return result[0] || null;
  }

  /**
   * 创建俱乐部申请
   * @param {Object} data - 俱乐部申请数据
   * @param {string} data.name - 姓名
   * @param {string} data.phone - 手机号码
   * @param {string} data.id_card - 身份证号码
   * @param {string} data.driver_license_type - 驾驶证类型
   * @param {string} data.blood_type - 血型
   * @param {string} data.license_obtained_date - 取得当前准驾时间
   * @param {string} data.occupation_type - 职业类型
   * @param {string} [data.company] - 工作单位
   * @param {string} [data.vehicle_info] - 车辆信息
   * @param {string} [data.license_plate] - 车牌号码
   * @param {string} data.vehicle_displacement - 车辆排量
   * @param {string} [data.application_reason] - 申请加入俱乐部理由
   * @returns {Promise<Object|null>} 创建的俱乐部申请信息，失败时返回null
   */
  async create(data) {
    if (data.license_obtained_date) {
      data.license_obtained_date = moment(data.license_obtained_date).format('YYYY-MM-DD');
    }
    try {
      const result = await this.app.mysql.insert('a8_club_applications', {
        name: data.name,
        phone: data.phone,
        id_card: data.id_card,
        driver_license_type: data.driver_license_type,
        blood_type: data.blood_type,
        license_obtained_date: data.license_obtained_date,
        occupation_type: data.occupation_type,
        company: data.company,
        vehicle_info: data.vehicle_info,
        license_plate: data.license_plate,
        vehicle_displacement: data.vehicle_displacement,
        application_reason: data.application_reason,
      });

      return await this.findById(result.insertId);
    } catch (error) {
      return null;
    }
  }

  /**
   * 更新俱乐部申请
   * @param {number} id - 俱乐部申请ID
   * @param {Object} data - 更新数据
   * @param {string} [data.name] - 姓名
   * @param {string} [data.phone] - 手机号码
   * @param {string} [data.id_card] - 身份证号码
   * @param {string} [data.driver_license_type] - 驾驶证类型
   * @param {string} [data.blood_type] - 血型
   * @param {string} [data.license_obtained_date] - 取得当前准驾时间
   * @param {string} [data.occupation_type] - 职业类型
   * @param {string} [data.company] - 工作单位
   * @param {string} [data.vehicle_info] - 车辆信息
   * @param {string} [data.license_plate] - 车牌号码
   * @param {string} [data.vehicle_displacement] - 车辆排量
   * @param {string} [data.application_reason] - 申请加入俱乐部理由
   * @returns {Promise<Object|{error: string}|null>} 更新后的俱乐部申请信息，不存在返回null，失败返回错误对象
   */
  async update(id, data) {
    // 先检查记录是否存在
    const application = await this.findById(id);
    if (!application) {
      return null;
    }

    if (data.license_obtained_date) {
      data.license_obtained_date = moment(data.license_obtained_date).format('YYYY-MM-DD');
    }

    const updateData = {};
    if (data.name) updateData.name = data.name;
    if (data.phone) updateData.phone = data.phone;
    if (data.id_card) updateData.id_card = data.id_card;
    if (data.driver_license_type) updateData.driver_license_type = data.driver_license_type;
    if (data.blood_type) updateData.blood_type = data.blood_type;
    if (data.license_obtained_date) updateData.license_obtained_date = data.license_obtained_date;
    if (data.occupation_type) updateData.occupation_type = data.occupation_type;
    if (data.company) updateData.company = data.company;
    if (data.vehicle_info) updateData.vehicle_info = data.vehicle_info;
    if (data.license_plate) updateData.license_plate = data.license_plate;
    if (data.vehicle_displacement) updateData.vehicle_displacement = data.vehicle_displacement;
    if (data.application_reason) updateData.application_reason = data.application_reason;

    try {
      await this.app.mysql.update('a8_club_applications', updateData, {
        where: {
          id
        }
      });
      return await this.findById(id);
    } catch (error) {
      return {
        error: error.message
      };
    }
  }

  /**
   * 删除俱乐部申请
   * @param {number} id - 俱乐部申请ID
   * @returns {Promise<Object|{error: string}|null>} 删除的俱乐部申请信息，不存在返回null，失败返回错误信息
   */
  async delete(id) {
    // 先检查记录是否存在
    const application = await this.findById(id);
    if (!application) {
      return null;
    }

    try {
      await this.app.mysql.delete('a8_club_applications', {
        id
      });
      return application;
    } catch (error) {
      return {
        error: error.message
      };
    }
  }
}

module.exports = a8Service;